//
//  Prototype.h
//  Charles
//
//  Created by Leo on 2019/6/6.
//  Copyright © 2019 charles. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@protocol Product <NSObject,NSCopying>

// use 方法是用于"使用"的方法.具体怎么"使用",则被交给子类去实现.
- (void)use:(NSString *)string;
// createClone方法是用于复制实例的方法.
- (id<Product>)createClone;

@end

@interface Manager : NSObject

// 保存了"名字"和"实例"之间的对应关系.
@property (nonatomic, strong) NSMutableDictionary *showCase;
// register方法会将接收到的一组"名字"和"Product接口",注册到showcase中.
- (void)registerName:(NSString *)name proto:(id<Product>)proto;
// 创建原型
- (id<Product>)create:(NSString *)protoName;

@end

@interface MessageBox : NSObject<Product>

- (instancetype)initWithDecochar:(char)decochar;
// use 方法会使用decochar字段中保存的字符把要显示的字符串框起来.
- (void)use:(NSString *)string;
// 用于复制自己
- (id<Product>)createClone;

@end

@interface UnderlinePen : NSObject<Product>

- (instancetype)initWithUlchar:(char)ulchar;
// use 方法会使用decochar字段中保存的字符把要显示的字符串框起来.
- (void)use:(NSString *)string;
// 用于复制自己
- (id<Product>)createClone;

@end

NS_ASSUME_NONNULL_END
